package com.millstein.tsinglog.controller;

import com.millstein.tsinglog.annotation.ResponseResult;
import com.millstein.tsinglog.annotation.ShiroAccessLog;
import com.millstein.tsinglog.model.dto.article.ArticleSaveDTO;
import com.millstein.tsinglog.model.vo.biz.ArticleVo;
import com.millstein.tsinglog.model.vo.result.PageResult;
import com.millstein.tsinglog.service.ArticleService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

@RestController
@RequestMapping("/article")
@ResponseResult
@CrossOrigin
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    /**
     * 分页并条件查询文章
     * @param currentPage 当前页
     * @param pageSize 每页的数据量
     * @param keyword 搜索关键字
     * @param cid 按分类搜索
     * @return
     */
    @GetMapping("/getArticleByPage")
    @RequiresPermissions("article:query")
    @ShiroAccessLog("查询文章信息")
    public PageResult<ArticleVo> getArticleByPage(Integer currentPage,
                                                  Integer pageSize,
                                                  String keyword,
                                                  Long cid) {
        return articleService.getArticleByPage(currentPage, pageSize, keyword, cid);
    }

    /**
     * 修改文章的展示状态
     * @param id 文章id
     * @param isRelease 是否发布
     * @param canComment 是否允许评论
     * @param upToTop 是否置顶
     * @return
     */
    @GetMapping("/changeArticleStatus")
    @RequiresPermissions("article:update")
    @ShiroAccessLog("修改文章状态")
    public void changeArticleStatus(Long id, Short isRelease, Short canComment, Short upToTop) {
        articleService.changeArticleStatus(id, isRelease, canComment, upToTop);
    }

    /**
     * 批量修改文章的展示状态
     * @param ids 文章集合
     * @param isRelease 是否发布
     * @param canComment 是否允许评论
     * @param upToTop 是否置顶
     * @return
     */
    @GetMapping("/changeMultiArticleStatus")
    @RequiresPermissions("article:update")
    @ShiroAccessLog("批量修改文章状态")
    public void changeMultiArticleStatus(@RequestParam List<Long> ids,
                                                       Short isRelease,
                                                       Short canComment,
                                                       Short upToTop) {
        articleService.changeMultiArticleStatus(ids, isRelease, canComment, upToTop);
    }


    /**
     * 新增文章的方法
     * @param articleSaveDTO 文章的数据
     * @return
     */
    @PostMapping("/insertArticle")
    @RequiresPermissions("article:insert")
    @ShiroAccessLog("新增文章信息")
    public void insertArticle(@Valid @RequestBody ArticleSaveDTO articleSaveDTO) {
        articleService.insertArticle(articleSaveDTO);
    }

    /**
     * 根据id获取文章信息
     * @param id 文章id
     * @return
     */
    @GetMapping("/getArticleById")
    @RequiresPermissions("article:update")
    public ArticleVo getArticleById(String id) {
        return articleService.getArticleById(Long.parseLong(id));
    }

    /**
     * 修改文章的方法
     * @param articleSaveDTO 文章的数据
     * @return
     */
    @PostMapping("/updateArticle")
    @RequiresPermissions("article:update")
    @ShiroAccessLog("修改文章信息")
    public void updateArticle(@Valid @RequestBody ArticleSaveDTO articleSaveDTO) {
        articleService.updateArticle(articleSaveDTO);
    }

    /**
     * 根据ids删除文章
     * @param ids 文章id
     * @return
     */
    @GetMapping("/deleteByIds")
    @RequiresPermissions("article:delete")
    @ShiroAccessLog("删除文章信息")
    public void deleteByIds(@RequestParam("ids") List<Long> ids) {
        articleService.deleteByIds(ids);
    }

    /**
     * 在轮播图新增的模态框中查询里面列表需要的展示的数据，这里的展示的文章需要满足两个条件
     *      1.文章已经启用
     *      2.文章还未增加到轮播图中
     * @param currentPage 当前页
     * @param keyword 搜索关键字
     * @return
     */
    @GetMapping("/getArticleDataForSave")
    @RequiresPermissions("carousel:insert")
    public PageResult<ArticleVo> getArticleDataForSave(Integer currentPage, String keyword) {
        return articleService.getArticleDataForSave(currentPage, keyword);
    }

}
